package com.ceair.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ceair.entity.ActReDeployment;
import com.ceair.entity.request.QueryActReDeploymentReq;
import com.ceair.entity.result.PageResult;
import com.ceair.entity.vo.ActReDeploymentVO;
import com.ceair.service.IActReDeploymentService;
import com.ceair.utils.ActReDeploymentStructMapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
 * @author wangbaohai
 * @ClassName ActReDeploymentController
 * @description: 流程部署基础信息管理相关接口
 * @date 2025年04月21日
 * @version: 1.0.0
 */
@RestController
@RequestMapping("/api/v1/actReDeployment")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "流程部署基础信息管理", description = "流程部署基础信息管理相关接口")
public class ActReDeploymentController {

    private final IActReDeploymentService actReDeploymentService;

    /**
     * 分页查询流程部署基础信息。
     *
     * @param queryActReDeploymentReq 流程部署基础信息查询请求对象，包含分页和筛选条件等信息，不能为空。
     * @return 包含流程部署基础信息视图对象列表的分页结果。如果查询或转换失败，则返回错误信息。
     * <p>
     * 功能描述：
     * 1. 调用服务层方法查询流程部署基础信息，并返回分页结果。
     * 2. 将查询结果中的记录转换为视图对象（VO）列表。
     * 3. 返回封装的分页结果对象，包含转换后的视图对象列表和总记录数。
     * 4. 如果查询或转换过程中发生异常，记录错误日志并返回错误信息。
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/actReDeployment/page')")
    @Parameter(name = "queryActReDeploymentReq", description = "流程部署基础信息查询请求对象", required = true)
    @Operation(summary = "分页查询流程部署基础信息")
    @PostMapping("/page")
    public PageResult<List<ActReDeploymentVO>> queryActReDeploymentWithPage(@RequestBody QueryActReDeploymentReq queryActReDeploymentReq) {
        try {
            // 调用服务层方法查询流程部署基础信息，并返回分页结果
            Page<ActReDeployment> page = actReDeploymentService.queryActReDeploymentWithPage(queryActReDeploymentReq);

            // 将查询结果中的记录转换为视图对象（VO）列表
            List<ActReDeploymentVO> list =
                    Optional.ofNullable(page.getRecords()).orElse(Collections.emptyList()).parallelStream().map(record -> {
                        try {
                            // 使用映射器将实体对象转换为视图对象
                            return ActReDeploymentStructMapper.INSTANCE.toVO(record);
                        } catch (Exception e) {
                            // 记录转换失败的错误信息
                            log.error("转换流程部署基础信息失败 具体原因为 : {}", e.getMessage());
                            return null;
                        }
                    }).filter(Objects::nonNull).toList();

            // 返回包含转换后列表和列表大小的PageResult对象
            return PageResult.success(list, page.getTotal());
        } catch (Exception e) {
            // 记录查询失败的错误信息，并返回错误结果
            log.error("查流程部署基础信息失败 具体原因为 : {}", e.getMessage());
            return PageResult.error("查询流程部署基础信息失败：" + e.getMessage());
        }
    }


}
